export default function createPageScrollLoadMixin(fetchFn, options = {}) {
	const {
		list_rows = 10,
			resFormat = 1, // 1: 第一种格式, 2: 第二种格式
			// 新增：处理每行数据的回调函数，默认返回原数据
			processRow = (row) => row
	} = options;

	return {
		data() {
			return {
				// 分页数据
				page: 1,
				list_rows: list_rows,
				total: 0,
				list: [],

				// u-loadmore组件相关状态
				loadStatus: 'loadmore', // 加载状态：loadmore/loading/nomore/error
				loadingText: '正在加载...',
				loadmoreText: '上拉加载更多',
				nomoreText: '没有更多了',
				errorText: '加载失败，点击重试',

				// 查询参数
				queryParams: {},
				scrollTop: 0
			};
		},

		onLoad() {
			// 页面加载时初始化数据
			// this.refresh();
		},

		// 页面滚动到底部时触发的钩子函数
		onReachBottom() {
			// 只有在loadmore状态下才触发加载
			if (this.loadStatus === 'loadmore') {
				this.loadMore();
			}
		},

		onPageScroll(e) {
			this.scrollTop = e.scrollTop;
			// #ifdef APP-NVUE
			this.scrollTop = e.detail.scrollTop;
			// #endif
		},

		watch: {
			// 监听查询参数变化，重新加载数据
			queryParams: {
				deep: true,
				handler() {
					this.refresh();
				}
			},

			// 监听默认参数变化，如果默认参数变了也重新加载
			defaultParams: {
				deep: true,
				handler() {
					this.queryParams = {
						...this.defaultParams
					};
					this.refresh();
				}
			}
		},

		methods: {
			/**
			 * 加载更多数据
			 */
			async loadMore() {
				// 正在加载中，防止重复请求
				if (this.loadStatus === 'loading') return;

				// 设置为加载中状态
				this.loadStatus = 'loading';

				try {
					// 构建请求参数
					const params = {
						page: this.page,
						list_rows: this.list_rows,
						...this.queryParams
					};
					// 调用请求函数
					const res = await fetchFn(params);
					// console.log(res);
					
					// 处理不同格式的返回数据
					let resultData;

					if (resFormat === 1) {
						// 第一种格式: { msg, code，data:{data:[],total}}
						resultData = {
							total: res?.data?.total || 0,
							rows: res?.data?.data || [],
						};
					} else {
						resultData = {
							total: res?.data?.list?.total || 0,
							rows: res?.data?.list?.data || [],
						};
					}
					// 新增：处理每行数据，添加额外属性
					resultData.rows = resultData.rows.map((row, index) => {
						// 调用配置的处理函数，传入当前行数据和索引
						return processRow(row, index);
					});
					// 更新数据
					this.total = resultData.total || 0;
					const newData = resultData.rows || [];

					if (this.page === 1) {
						// 第一页直接替换数据
						this.list = newData;
					} else {
						// 后续页追加数据
						this.list = [...this.list, ...newData];
					}
					// console.log('list>>>>>>>', this.list);
					// 判断是否还有更多数据
					if (this.list.length >= this.total || newData.length < this.list_rows) {
						this.loadStatus = 'nomore'; // 没有更多数据了
					} else {
						this.loadStatus = 'loadmore'; // 可以继续加载
						this.page++; // 准备加载下一页
					}
				} catch (err) {
					console.error('加载失败:', err);
					this.loadStatus = 'error'; // 加载失败状态
				}
			},

			/**
			 * 重新加载数据
			 */
			refresh() {
				this.page = 1;
				this.loadStatus = 'loadmore'; // 重置为可加载状态
				this.loadMore();
			},

			/**
			 * 更新查询参数
			 * @param {Object} newParams - 新的查询参数
			 */
			updateParams(newParams) {
				this.queryParams = {
					...this.queryParams,
					...newParams
				};
			},

			/**
			 * 加载失败时重试
			 */
			retryLoad() {
				if (this.loadStatus === 'error') {
					this.loadMore();
				}
			}
		}
	};
}